﻿\subsection{构建 FAT32 文件系统}

在 FAT32 文件系统中，文件被分割为若干个基本单位——簇（Cluster），存放于磁盘上。文件的各个簇以链表的形式链接在一起。
链表指针以元组的形式集中存放在单独的数据块中，形成文件分区表（File Allocation Table，FAT）。
分区表采用冗余备份方式存放，即以一式两份方式存放于磁盘中。
诸如 FAT 大小等的文件系统元信息存放在主引导记录扇区中，主引导记录与引导加载器等用于引导操作系统的扇区共同构成 BIOS 参数块（BIOS Parameter Block，BPB）。
BPB 中指明了文件系统根目录所在的簇，从根目录出发可访问到文件系统中的所有文件 \cite{fat-spec}。

如图 \ref{FAT32_EXAMPLE}，根目录起始簇号为 2，共占用 2 个簇，2 号簇的后继为 \lstinline{FAT[2] = 6}；
普通文件 \lstinline{\FILE.TXT} 起始簇号为 3，共占用 2 个簇，3 号簇后继为 \lstinline{FAT[3] = 5}；
子目录文件 \lstinline{\SimpleOS\} 起始簇号为 4，占用 1 个簇，任意子目录的首两个目录项必须为 \lstinline{.} 和 \lstinline{..}，分别代表当前目录和上级目录。
\lstinline{EOF} 是特殊的簇号，其值为 \lstinline{-1} 的补码 \lstinline{0xFFFF'FFFF}，代表该簇为文件的最后一个簇。

\begin{figure}[h!]
    \Centering
    \caption{FAT32 文件系统示例}
    \label{FAT32_EXAMPLE}
    \includegraphics[scale=0.6]{build/Paper/Assets/FAT32_EXAMPLE.pdf}
\end{figure}

构建 FAT32 文件系统，本质上就是向引导块中添加 FAT32 元信息，创建分区表。
本操作系统文件映像存放于 \GiB{1} 的磁盘中，主引导记录占用 \Bytes{512}，引导加载器占用 \Bytes{2048}，
根据 FAT32 格式规范，还需要在 BPB 中存放文件系统信息结构 \lstinline{FSInfo}，
并在第六逻辑扇区和第七逻辑扇区分别存放主引导记录和文件系统信息结构的冗余副本。
鉴于一页虚拟内存大小为 \Bytes{4096}，可将文件系统的簇大小设置为 8 个扇区。
FAT32 分区表每个表项占 \Bytes{4}，则存储单个 FAT 至少需要 2048 个扇区。
综上所述，BPB 占用 8 个扇区，FAT 占用 4096 个扇区，故根目录文件的首个簇可存放在第 4104 逻辑扇区。

\begin{figure}[h!]
    \Centering
    \caption{分区方案}
    \label{PART_SCHEME}
    \includegraphics[scale=0.6]{build/Paper/Assets/PartitionScheme.pdf}
\end{figure}

需要指出 BPB 和两份 FAT 不论其大小，均被分别视作一个簇，在 FAT 中占用 0 号和 1 号表项，因此按照上述设计方案，根目录文件的首个簇簇号应设置为 2。
按照此种方式初始化根目录后，在根目录中创建新的子目录 \lstinline{SimpleOS}，并将操作系统内核映像 \lstinline{SimpleOS.out} 添加到该子目录下，可由第三方工具检查该初始文件系统的正确性。
